/*                          UX-Framework                               
 *                                                                 
 *  iZE Co.,Ltd. Copyright 2009 All rights reserved.          
 *  This file is distributed under the terms of the GNU Lesser 
 *  General Public License, described in file LICENSE.                                     
 */
/** 
 * UXComponent クラス<br>
 * UXコンポーネント群の基礎クラス。<br>
 *
 * @author		iZE Co., Ltd.<br>
 * @version		$Id: UXButton.hx 20 2009-02-04 08:23:19Z yimai.v $<br>
 */
package jp.ize.ux.components;

// {{{ imports
import jp.ize.ux.UXObject;
import jp.ize.ux.UXController;
import jp.ize.ux.UXInteractionChain;
import jp.ize.ux.interactions.UXEnableInteraction;
import jp.ize.ux.interactions.UXVisibilityInteraction;
import jp.ize.ux.interactions.UXFocusInteraction;
import jp.ize.ux.interactions.UXInitInteraction;
import jp.ize.ux.interactions.UXLayoutInteraction;
import jp.ize.ux.interactions.UXActionInteraction;
import jp.ize.ux.interactions.UXHighlightInteraction;
import jp.ize.ux.interactions.UXMoveInteraction;
import jp.ize.ux.interactions.UXResizeInteraction;
import jp.ize.ux.interactions.UXFinalInteraction;
//import jp.ize.ux.UXResource;
// }}}
// {{{ class UXComponent extends UXObject
class UXComponent<S> extends UXObject
{
	// {{{ properties

	public var state : S;

	// }}}
	// {{{ public var ctrl(default, default) : UXController<S>;
	/**
	 * このコンポーネントのインタラクションを管理するコントローラークラスのインスタンスです。
	 */
	public var ctrl(default, default) : UXController<S>;
	// }}}
	// {{{ public function new( c:UXController<S> ) : Void
	/**
	 * コンストラクタ.
	 *
	 * @param c:UXControllerを指定します。
	 */
	public function new( c:UXController<S> ) : Void
	{
		super();
		ctrl = c;
		ctrl.addInteraction( new UXEnableInteraction<S>() );
		ctrl.addInteraction( new UXVisibilityInteraction<S>() );
		ctrl.addInteraction( new UXFocusInteraction<S>() );
		ctrl.addInteraction( new UXInitInteraction<S>() );
		ctrl.addInteraction( new UXLayoutInteraction<S>() );
		ctrl.addInteraction( new UXActionInteraction<S>() );
		ctrl.addInteraction( new UXHighlightInteraction<S>() );
		ctrl.addInteraction( new UXMoveInteraction<S>() );
		ctrl.addInteraction( new UXResizeInteraction<S>() );
		ctrl.addInteraction( new UXFinalInteraction<S>() );
		state = c.state;
	}
	// }}}
	// {{{ public function addUXChild( c:UXObject ) : Void
	/**
	 * 子要素を追加します。
	 */
	override public function addUXChild( c:UXObject ) : Void
	{
		super.addUXChild(c);
		ctrl.addUXChild(c);
	}

	// }}}
	// {{{ public function removeUXChild( c:UXObject ) : Void
	/**
	 * 子要素を削除します。
	 */
	override public function removeUXChild( c:UXObject ) : Void
	{
		super.removeUXChild(c);
		ctrl.removeUXChild(c);
	}

	// }}}
	// {{{ public function trigger( intername:String, ?o:Dynamic ) : Void
	/**
	* UXController の trigger() を wrapping しています。
	* インタラクションを手動で発動します。
	* o は、eventTarget です。
	*/
	public function trigger( intername:String, ?o:Dynamic ) : Void
	{
		ctrl.trigger(intername,o);
	}
	// }}}
	// {{{ public function triggerChain( chain:UXInteractionChain ) : Void
	/**
	* 連続するインタラクションを発動します。
	*/
	public function triggerChain( chain:UXInteractionChain ) : Void
	{
		ctrl.triggerChain(chain);
	}
	// }}}
}
// }}}
